<?php

namespace api\wxapp\controller;

use cmf\controller\PublicController;
use think\Validate;
use think\Db;
use api\common\service\MsgService;
use api\common\service\FunctionService;
use Firebase\JWT\JWT;
use api\common\model\RlEtAzdModel;
use think\Config;
use think\Cache;
class LoginController extends PublicController
{
    /**
     * 登录过期时间
     * @var string
     */
    protected $expire_time = 30;

    /**
     * 是否开始验证码测试模式
     * @var bool
     */
  //  protected $is_code = true;
    protected $is_code = false;


    /**
     * 访问限制
     * @var array
     */
    protected $auth = [];

    /**
     * 用户信息登录操作
     * @param []
     * @return []
     * @date 2019/12/13 5:55 PM
     */
    public function Login()
    {
        // 验证的规则
        $rule = [
            'code' => 'require',
            'type' => 'require',
            'phone' =>'require|length:11|regex:/^1[3456789]\d{9}$/',
            'msg_code' => 'require',
        ];
        // 错误的消息
        $msg = [
            'code.require' => '缺少参数code',
            'type.require' => '缺少用户类型!',
            'phone.require' => '请输入手机号或用户名!',
            'phone.length' => '手机号位数不对!',
            'phone.regex' => '手机号格式不对!',
            'msg_code.require' => '请输入手机验证码',
        ];
        // 获取的数据
        $data = [
            'code'  => $this->request->param('code'), // 获取登录参数
            'type'   => $this->request->param('type'), // 获取用户类型
            'phone'   => $this->request->param('phone'), // 获取手机号
            'msg_code'  => $this->request->param('msg_code'), // 获取验证码
            'sd'  => $this->request->param('sd'),
        ];
        // 直接传入验证规则
        $validate = Validate::make($rule)->message($msg);
        // 需要验证的数据
        $result = $validate->check($data);
        // 判断是否有验证错误
        if(!$result){
            // 验证错误提示
            $this->error($validate->getError());
        }
        // 判断验证码操作
        $codeResult = $this->code_check($data);
        // 判断验证码是否正确
        if($codeResult === false){
            $this->error('验证码不正确或已失效');
        }
        // 判断用户类型是否为安装队
        if($data['type'] == 1 || $data['type'] == 2){
            // 检查安装队登录验证
            $result = $this->install_team_ckeck($data);
        } else {
            // 检查其他用户登录验证
            $result = $this->user_info_ckeck($data);
        }
        // 判断是否可以登录
        if($result['status'] == 1){
            // 生成接口
            if(isset($data['sd'])){
                $url = "https://api.weixin.qq.com/sns/jscode2session?appid=".Config::get('wxConfig.appid')."&secret=".Config::get('wxConfig.appsecret')."&js_code=".$data['code']."&grant_type=authorization_code";
            }else{
                $url = "https://api.weixin.qq.com/sns/jscode2session?appid=".$this->appId."&secret=".$this->appSecret."&js_code=".$data['code']."&grant_type=authorization_code";
            }
            // 微信登录接口地址
            $response = $this->cmf_curl_get_https($url);
            // 格式化结果
            $response = json_decode($response, true);
            // 判断是否请求成功
            if (!empty($response['errcode'])) {
                // $this->error('登录失败!');
                return json(['code'=>10020,'msg'=>'登录失败2']);
            }
            // 获取openid
            $openid = $response['openid'];
            // 判断用户类型是否为安装队
            if($data['type'] != $this->install_team_type && $data['type'] !=2){
                // 判断是否有openid
                if($result['user']['openid'] != $openid){
                    // 更新用户openid
                    $msg_result = Db::name('rl_zsms_user_query')
                        ->where('zsms_user_query_id', $result['uid'])
                        ->where('ignore',0)
                        ->update(['openid' => $openid,'update_time' => time()]);
                    // 判断是否更新成功
                    if(!$msg_result){
                        // $this->error('登录失败!');
                        return json(['code'=>10020,'msg'=>'登录失败1']);
                    }
                }
            }else{
                if($result['user']['openid'] != $openid){
                    // 更新用户openid
                    $msg_result = Db::name('rl_et_azd')
                        ->where('phone',  $result['uid'])
                        ->update(['openid' => $openid]);

                } // 生成token
            }
            $JwtToken = $this->_setJwtToken($result['type'],$result['uid'],$openid);
           // dump($JwtToken);die;
            // 判断是否生成成功
            if($JwtToken['code'] == '200'){
                // 删除验证码缓存
                cache('user_code'.$data['phone'], NULL);
                // 返回登录token
                if($result['type'] ==1)
                {
                  if(strpos($result['user']['server_code'],'AZ')!==false){
                        //安装商
                        $this->success('登录成功',['token'=>$JwtToken['jwt'],'user'=>$result['user'],'type'=>100]);
                  }
                //  if(strpos($result['user']['server_code'],'FW')!==false){
                    //安装商
                    $this->success('登录成功',['token'=>$JwtToken['jwt'],'user'=>$result['user'],'type'=>200]);
                 // }
                      //  $this->success('登录成功',['token'=>$JwtToken['jwt'],'user'=>$result['user'],'type'=>100]);
                }else{
                    $this->success('登录成功',['token'=>$JwtToken['jwt'],'user'=>$result['user'],'type'=>$result['user']['gw']]);
                }
            } else {
                $this->error($JwtToken['info']);
            }
        } else {
            $this->error($result['info']);
        }
           
    }
function cmf_curl_get_https($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //  参数为1表示传输数据，为0表示直接输出显示。   设置是否输出结果  

    curl_setopt($ch, CURLOPT_HEADER,false);
    $content = curl_exec($ch);
    curl_close($ch);
    return $content;
}
    /**
     * 签发token
     * @param []
     * @return []
     * @author qiaojinzhou <18839305241@163.com>
     * @date 2019/12/16 11:42 AM
     */
    private function _setJwtToken($type,$uid,$openid)
    {
        vendor('firebase.php-jwt.src.JWT');
        $key = config('jwt')['key'];
        $time = time();
        // 生成token
        $token = [
            "iss"=>"",  //签发者 可以为空
            "aud"=>"", //面象的用户，可以为空
            "iat" => $time, //签发时间
            "nbf" => $time + 10, //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
            "exp" => 3600 * 24 * $this->expire_time + $time + 10, //token 过期时间
            "type" => $type,
            "uid" => $uid,
            "openid" => $openid,
        ];
        try {
            $jwt = JWT::encode($token, $key);
            return ['code'=>200,'jwt'=>$jwt];
        } catch (\Exception $e) {
            return ['code'=>$e->getCode(),'info'=>$e->getMessage()];
        }
    }

    /**
     * 其他用户类型登录操作
     * @param $data=>登录信息
     * @return ['status'=>状态,'info'=>提示消息,'type'=>类型,'user'=>用户信息]
     * @date 2019/12/13 6:43 PM
     */
    public function user_info_ckeck($data)
    {
        // 获取登录用户信息
        $info = Db::name('rl_zsms_user_query')->where('ignore',0)->where('mobilphone',$data['phone'])->find();
        // 判断用户是否存在
        if(empty($info)){
            return ['status'=>'0','info'=>'用户不存在！'];
        }
        // 判断用户是否属于正常
        if($info['status'] != '1'){
            return ['status'=>'0','info'=>'该用户未授权!'];
        }
        // 判断用户是否属于该岗位
        if($data['type']==3)
        {
            if(!in_array($info['gw'],[0,1,2])){
                return ['status'=>'0','info'=>'角色选择错误!'];
            }

      

            $sql="select * from cmf_rl_et_company as et
            left join cmf_rl_company as rl on rl.orgdept=et.fgs
            where rl.active_flag=1 and et.flag=1 and et.jxsbm='{$info['jxs_code']}' group by rl.orgdept";
            
            $fgs=Db::query($sql);
           
            //查询是否试点
            $i=1;
            foreach($fgs as $fgsk=>$fgsv){
               
                if(count($fgs)==1){
                    //单个 
                    if($fgsv['testnode']==1){
                        //限制登录试点
                        if(!isset($data['sd'])){
                            //普通小程序
                           $this->error('非试点分公司人员不能登录');
                        }
    
    
    
                    }else{
                        if(isset($data['sd'])){
                            //普通小程序
                            $this->error('非试点分公司人员不能登录');
                        }
                    }
                }else{
                  
                    //普通小程序
                    //多个 包含试点
                    if($fgsv['testnode']==1){
                     
                      if( $i=count($fgs)){
                            //限制登录试点
                        if(!isset($data['sd'])){
                            //试点小程序
                           // $this->error('试点分公司不能登录');
                        }
                      }
                      $i++; 
                    }
                  
                    
                }
              
            }

        }
        if($data['type']==4)
        {
            if(!in_array($info['gw'],[3,4,5,6,7,8,9,10])){
                return ['status'=>'0','info'=>'角色选择错误!'];
            }



            $testnode=Db::table('cmf_rl_company')->where([
                'orgdept'=>$info['bm_code'],
                'active_flag'=>1
            ])->value('testnode');
            if(isset($data['sd'])){
                if($testnode==0){
                    $this->error('非试点分公司，不能登录');
                }
            }else{
                if($testnode==1){
                    $this->error('试点分公司，不能登录');
                }
            }

        }
//        if($data['type']==4)
//        {
//            if(!in_array($info['gw'],[3,4,5,6])){
//                return ['status'=>'0','info'=>'角色选择错误!'];
//            }
//        }
//        if($data['type']==5)
//        {
//            if(!in_array($info['gw'],[7])){
//                return ['status'=>'0','info'=>'角色选择错误!'];
//            }
//        }
//        if($data['type']==6)
//        {
//            if(!in_array($info['gw'],[8,9,10])){
//                return ['status'=>'0','info'=>'角色选择错误!'];
//            }
//        }
        return ['status'=>'1','info'=>'验证通过','type'=>2,'uid'=>$info['zsms_user_query_id'],'user'=>$info];
    }

    /**
     * 安装队用户类型登录操作
     * @param $data=>登录信息
     * @return ['status'=>状态,'info'=>提示消息,'type'=>类型,'user'=>用户信息]
     * @date 2019/12/13 6:38 PM
     */
    public function install_team_ckeck($data)
    {
   
       // 后续操作
       $mumber = RlEtAzdModel::where('phone',$data['phone'])->where('active_flag','<>',0)->count();
       if($mumber>1)
       {
           $this->error('账号重复');
       }
       $res = RlEtAzdModel::where('phone',$data['phone'])->where('active_flag','<>',0)->find();
       $sql="select `rlcompany`.`orgdept`,`rlcompany`.`testnode` from cmf_rl_et_cust_instal_rel rel 
       left join cmf_rl_et_company company  on rel.jxsbm=company.jxsbm
       right join cmf_rl_company rlcompany  on rlcompany.orgdept=company.fgs
        where rel.server_code='{$res['server_code']}' 
        and rel.flag=1 and company.flag=1
        and rlcompany.active_flag=1   group by rlcompany.orgdept";
       $fgs=Db::query($sql);
       //查询是否试点
       $i=1;
       foreach($fgs as $fgsk=>$fgsv){
          
           if(count($fgs)==1){
               //单个 
               if($fgsv['testnode']==1){
                   //限制登录试点
                   if(!isset($data['sd'])){
                       //普通小程序
                       $this->error('非试点分公司人员不能登录.');
                   }



               }else{
                   if(isset($data['sd'])){
                       //普通小程序
                       $this->error('非试点分公司人员不能登录');
                   }
               }
           }else{
             
               //普通小程序
               //多个 包含试点
               if($fgsv['testnode']==1){
                
                 if( $i=count($fgs)){
                       //限制登录试点
                   if(!isset($data['sd'])){
                       //试点小程序
                       //$this->error('试点分公司不能登录');
                   }
                 }
                 $i++; 
               }
             
               
           }
         
       }
      // if(isset($data['sd']) and $i==1){
        //   $this->error('非试点分公司不能登录~');
      // }
       if(empty($res)) $this->error('该用户不存在');
       if($res['active_flag']==0) $this->error('该用户未授权');
       if($data['type']==1)
       {
           if(strpos($res['server_code'],'AZ')!==false){
               return ['status'=>'0','info'=>'角色选择错误!'];
           }
       }
       if($data['type']==2)
       {
           if(strpos($res['server_code'],'AZ')===false){
               return ['status'=>'0','info'=>'角色选择错误!'];
           }
       }
       return ['status'=>'1','info'=>'验证通过','type'=>1,'uid'=>$res['phone'],'user'=>$res];
    }

    /**
     * 验证码检测操作
     * @param $data=>登录信息
     * @return []
     * @date 2019/12/13 6:55 PM
     */
    public function code_check($data)
    {
        // 获取该手机已发送的验证码
        $cache_code = cache('user_code'.$data['phone']);
//        // 判断验证码是否存在
        if(empty($cache_code)){
            return false;
        }
        // 专用测试手机号

        if($data['phone'] ==18953233568){
            // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
        }
	if($data['phone'] ==18358572297){
            // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
        }

        if($data['phone'] ==13554871232){
            // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
        }
	if($data['phone'] ==18621780195){
            // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
        }
 if($data['phone'] ==13770934916){
            // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true; 
            }
        }    
if($data['phone'] ==17585715211){
            // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
        }   
        if($data['phone'] == 15959600619){
            // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
        }
         if($data['phone'] == 18953233568){
            // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
        }

	if($data['phone']== 13820937192){
        // 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
        }

	if($data['phone']==13687003310){
	// 判断验证码是否正确
            if($data['msg_code'] == 6688){
                return true;
            }
	}

        if($data['phone']==17710118412){
       //用户的账号，测试用号
            if($data['msg_code'] == 6688){
                return true;
            }
        }

        // 判断是否为测试阶段
        if($this->is_code === true){
            // 判断验证码是否正确
            if($data['msg_code'] != 6688){
                return false;
            }
        } else {
            // 判断验证码是否正确
            if($cache_code != $data['msg_code']){
                return false;
            }
        }
        return true;
    }

    /**
     * 登录发送手机验证码
     * @param []
     * @return []
     * @date 2019/12/13 7:00 PM
     */
    public function sendPhone()
    {
        // 获取手机号
        $mobile = $this->request->param('phone');
        // 判断手机格式是否正确
        if(!preg_match('/^1[3456789]\d{9}$/',$mobile)){
            $this->error('手机格式不正确');
        }
        // 专用测试手机号

        if($mobile == 18895385281){
            // 缓存验证码
            cache('user_code'.$mobile,'6688',300);
            $this->success('验证码发送成功，请注意查收');
        }
        // 判断是否为测试阶段
        if($this->is_code === true){
            // 缓存验证码
            cache('user_code'.$mobile,'6688',300);
            $this->success('验证码发送成功，请注意查收');
        } else {
            // 生成手机验证码
            $mobile_code = FunctionService::random(4,1);
            // 引用发送验证码类
            $msg_send = new MsgService();
            // 发送手机验证码
            $res = $msg_send->singlesender($mobile_code,$mobile);
            // 判断验证码是否发送成功
            // var_dump($res);
            if($res) {
                // 缓存验证码
                cache('user_code'.$mobile,$mobile_code,300);
                $this->success('验证码发送成功，请注意查收');
            } else {
                $this->error('验证码发送失败');
            }
        }
    }
}
